/**
 * @file SystemeDeVersionnage.h
 * @author Pierre Le Bodic
 * @date lundi 12 décembre
 */

#include <vector>
#include <string>
#include "ExceptionDeVersion.h"

#ifndef _SYSTEME_DE_VERSIONNAGE_H_
#define _SYSTEME_DE_VERSIONNAGE_H_

namespace gestionnaireDeVersions {
   using std::string;
   using std::vector;
   class Version;

/**
 * Cette classe permet de modéliser un système de versionnage 
 * (numérotation des versions d'un logiciel), en fournissant une série 
 * de fonctions qui permettent de créer, manipuler et comparer des 
 * versions.
 * Cette classe est virtuelle pure et ses filles sont censées
 * implémenter le "design pattern" singleton.
 */
class SystemeDeVersionnage {
   protected:
      ///nom du systeme de versionnage, par exemple "versionnage à la GNU"
      const string nom;
      
      /**
       * Initialise simplement le nom.
       * @param nom Le nom du système de versionnage.
       */
      SystemeDeVersionnage(string nom);
      
   public:   
      /**
       * Etant donnée une chaîne de caractères représentant une version
       * en entrée, cette fonction vérifie si la chaîne est bien formée
       * pour ce système de versionnage.
       * @param version La chaîne qui représente la version.
       * @return Vrai ssi la version est valide pour ce versionnage.
       */
      virtual bool estValide(const string version) const=0;
      
      /**
       * Compare deux versions et retourne 0 si elles sont identiques,
       * 1 si v1 est plus récente que v2, -1 sinon.
       * @param v1 La première version à comparer.
       * @param v2 La deuxième version à comparer.
       * @return Un entier indiquant laquelle des deux versions est la
       * plus récente.
       * @throw ExceptionDeVersion Si l'a chaîne de caractère
       * correspondant à l'une des deux versions n'est pas valide.
       */
      virtual int compare(const Version * const v1, const Version * const v2) const throw(ExceptionDeVersion);
      
      /**
       * Compare deux chaînes de caractères, de la même manière que deux
       * Versions sont comparées dans l'autre fonction compare.
       * retourne 0 si elles sont identiques, 1 si v1 est plus récente
       * que v2, -1 sinon.
       * @param s1 La première chaîne à comparer.
       * @param s2 La deuxième chaîne à comparer.
       * @return Un entier indiquant laquelle des deux versions est la
       * plus récente.
       * @throw ExceptionDeVersion Si l'a chaîne de caractère
       * correspondant à l'une des deux versions n'est pas valide.
       */
      virtual int compare(const string s1, const string s2) const throw(ExceptionDeVersion)=0;
      
      /**
       * Retourne le nom du système de versionnage.
       * @return Le nom du système de versionnage.
       */
      virtual const string getNom() const;
};

}//namespace

#include "Version.h"

#endif // _SYSTEME_DE_VERSIONNAGE_H_
